package com.ufgov.pdf.util;

import java.io.File;
import java.io.StringReader;
import java.util.List;

import javax.xml.bind.JAXBContext;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/**
 * Jaxb2工具类 xml转换成JavaBean核心方法
 * 
 * @author lihhz
 * @create 2018-4-9 下午2:40:14
 */
public class JaxbUtil {

	/**
	 * xml转换成JavaBean
	 * 
	 * @param xml
	 * @param c
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static <T> T converyToJavaBean(String xmlPath, Class<T> clazz) {
		try {
			// 根据指定的路径创建file对象
			File xmlFile = new File(xmlPath);
			if (!xmlFile.exists()) {
				throw new Exception("文件xml-config/" + xmlPath + ".xml不存在!!!");
			}
			Document xmlDocument = (new SAXReader()).read(xmlFile);
			replInclude(xmlDocument.getRootElement());
			return (T) JAXBContext.newInstance(clazz).createUnmarshaller()
					.unmarshal(new StringReader(xmlDocument.asXML()));
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 这是一个递归 目的是替换文档中的include标签 还有一个tablepage的问题有待解决 该方法有待大量include测试
	 * 
	 * @param srcEle
	 * @throws Exception
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	private static void replInclude(Element srcEle) throws Exception {
		Element inc = srcEle.element("include");
		if (inc != null) {
			File file = new File(
					JaxbUtil.class.getClassLoader().getResource("xml-config/" + inc.attributeValue("file")).getFile());
			if (!file.exists()) {
				throw new Exception("文件" + inc.attributeValue("file") + "没有找到!!!");
			}
			// 使用文件中的内容替换include
			Element rootEle = (new SAXReader()).read(file).getRootElement();
			// TODO:这个被包含页面不能有tablepage标签的问题要解决一下
			if (rootEle.getName().equalsIgnoreCase("tablepage")) {
				throw new Exception("被包含页面不能有tablepage标签!!!");
			}
			replInclude(rootEle);
			List content = srcEle.content();// inc.getParent()
			content.set(content.indexOf(inc), rootEle);
		}

		List<Element> list = srcEle.elements();
		if (list != null && list.size() > 0) {
			for (Element element : list) {
				replInclude(element);
			}
		}
	}

	// /**
	// * JavaBean转换成xml 默认编码UTF-8
	// *
	// * @param obj
	// * @param writer
	// * @return
	// */
	// public static String convertToXml(Object obj) {
	// return convertToXml(obj, "UTF-8");
	// }

	// /**
	// * JavaBean转换成xml
	// *
	// * @param obj
	// * @param encoding
	// * @return
	// */
	// public static String convertToXml(Object obj, String encoding) {
	// String result = null;
	// try {
	// JAXBContext context = JAXBContext.newInstance(obj.getClass());
	// Marshaller marshaller = context.createMarshaller();
	// marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
	// marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
	//
	// StringWriter writer = new StringWriter();
	// marshaller.marshal(obj, writer);
	// result = writer.toString();
	// } catch (Exception e) {
	// e.printStackTrace();
	// }
	//
	// return result;
	// }

}